package config

import (
	"fmt"
	"log"
	"time"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
)

var DB *gorm.DB

// DatabaseConfig 数据库配置
type DatabaseConfig struct {
	Host     string
	Port     string
	Username string
	Password string
	Database string
	Charset  string
}

// GetDefaultDatabaseConfig 获取默认数据库配置
func GetDefaultDatabaseConfig() *DatabaseConfig {
	return &DatabaseConfig{
		Host:     "127.0.0.1",
		Port:     "3306",
		Username: "root",
		Password: "root",
		Database: "tunnel_db",
		Charset:  "utf8mb4",
	}
}

// InitDatabase 初始化数据库连接
func InitDatabase() error {
	config := GetDefaultDatabaseConfig()

	// 构建 DSN (Data Source Name)
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s&parseTime=True&loc=Local",
		config.Username,
		config.Password,
		config.Host,
		config.Port,
		config.Database,
		config.Charset,
	)

	// 配置 GORM 日志
	gormConfig := &gorm.Config{
		Logger: logger.Default.LogMode(logger.Info),
	}

	var err error
	DB, err = gorm.Open(mysql.Open(dsn), gormConfig)
	if err != nil {
		DB = nil // 确保在连接失败时 DB 为 nil
		return fmt.Errorf("连接数据库失败: %v", err)
	}

	// 配置连接池
	sqlDB, err := DB.DB()
	if err != nil {
		DB = nil // 确保在获取实例失败时 DB 为 nil
		return fmt.Errorf("获取数据库实例失败: %v", err)
	}

	// 设置最大打开连接数
	sqlDB.SetMaxOpenConns(100)
	// 设置最大空闲连接数
	sqlDB.SetMaxIdleConns(10)
	// 设置连接的最大生存时间
	sqlDB.SetConnMaxLifetime(time.Hour)

	log.Println("✅ 数据库连接成功")
	return nil
}

// GetDB 获取数据库实例
func GetDB() *gorm.DB {
	return DB
}

// CloseDatabase 关闭数据库连接
func CloseDatabase() error {
	if DB != nil {
		sqlDB, err := DB.DB()
		if err != nil {
			return err
		}
		return sqlDB.Close()
	}
	return nil
}
